package com.orm.mybatis.orm;

import java.util.List;

import com.orm.TableInfo;
import com.orm.mybatis.format.Format;

import lombok.Getter;
import lombok.ToString;
import lombok.extern.log4j.Log4j2;

/**
 * 通过反射创建mybatis的基本sql语句
 */
@Getter
@ToString
@Log4j2
public class Mybatis {
	/**
	 * 记录表信息的类
	 */
	private TableInfo info;

	public Mybatis(Class<?> classType) {
		info = new TableInfo(classType);
	}

	/**
	 * 返回增加的sql语句 insert into stu(empno) values(#{empno});
	 */
	public String insert() {
		// 定义映射sql
		StringBuilder sql = new StringBuilder("INSERT INTO ");
		// 定义映射sql的后半段
		StringBuilder values = new StringBuilder(" VALUES(");
		// 进行插入表名的拼接
		sql.append(info.getTable() + "(");
		sql.append(info.getId() + ",");
		// 获取所有的属性
		List<String> columns = info.getColumn();
		// 列名
		for (String column : columns) {
			// 获取属性名进行拼接
			sql.append(column + ",");
		}
		values.append(Format.precompiledStr(info.getFieldId()) + ",");
		// 属性名
		List<String> fields = info.getField();
		for (String field : fields) {
			// 进行后续values值sql的拼接
			values.append(Format.precompiledStr(field) + ",");
		}
		// 进行字符串的最后逗号的替换
		sql.replace(sql.length() - 1, sql.length(), ")");
		values.replace(values.length() - 1, values.length(), ")");
		sql.append(values);
		log.info("insert : "+sql.toString());
		return sql.toString();
	}

	/**
	 * 返回删除的sql语句
	 */
	public String delete() {
		// 定义映射sql
		StringBuilder sql = new StringBuilder("DELETE FROM ");
		// 进行删除表名的拼接
		sql.append(info.getTable());
		// 进行删除条件的拼接
		sql.append(" WHERE ");
		// 添加条件
		sql.append(Format.longPrecompiledStr(info.getId(),info.getFieldId()));
		log.info("delete : "+sql.toString());
		return sql.toString();
	}

	/**
	 * 返回修改的sql语句
	 */
	public String update() {
		// 定义映射sql
		StringBuilder sql = new StringBuilder("UPDATE ");
		// 拼接修改的表
		sql.append(info.getTable() + " SET ");
		// 获取所有的属性
		List<String> columns = info.getColumn();
		List<String> fields = info.getField();
		for (int i = 0; i < columns.size(); i++) {
			// 进行sql的映射拼接
			sql.append(Format.longPrecompiledStr(columns.get(i),fields.get(i)) + ",");
		}
		
		// 将sql映射的最后一个逗号截取掉
		sql.replace(sql.length() - 1, sql.length(), "");
		// 进行主键条件的拼接
		sql.append(" WHERE " + Format.longPrecompiledStr(info.getId(),info.getFieldId()));
		log.info("update : "+sql.toString());
		return sql.toString();
	}

	/**
	 * 返回查询的sql语句,若flag为true,则返回所有的查询,为false则返回该对象的查询
	 */
	public String select(boolean flag) {
		// 定义映射sql
		StringBuilder sql = new StringBuilder("SELECT");
		// 获取所有的属性
		List<String> columns = info.getColumn();
		sql.append(Format.decStr(info.getId()));
		// 遍历所有的属性
		for (String column : columns) {
			// 进行sql的映射拼接
			sql.append(Format.decStr(column));
		}
		// 将sql映射的最后一个逗号截取掉
		sql.replace(sql.length() - 1, sql.length(), "");
		// 进行sql映射表名的拼接
		sql.append(" FROM " + info.getTable());
		// 判断是否是对象的映射
		if (!flag) {
			sql.append(" WHERE " + Format.longPrecompiledStr(info.getId(),info.getFieldId()));
		}
		log.info("select : "+sql.toString());
		return sql.toString();
	}
}
